{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolutional Networks\n",
    "So far we have worked with deep fully-connected networks, using them to explore different optimization strategies and network architectures. Fully-connected networks are a good testbed for experimentation because they are very computationally efficient, but in practice all state-of-the-art results use convolutional networks instead.\n",
    "\n",
    "First you will implement several layer types that are used in convolutional networks. You will then use these layers to train a convolutional network on the CIFAR-10 dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# As usual, a bit of setup\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from cs231n.classifiers.cnn import *\n",
    "from cs231n.data_utils import get_CIFAR10_data\n",
    "from cs231n.gradient_check import eval_numerical_gradient_array, eval_numerical_gradient\n",
    "from cs231n.layers import *\n",
    "from cs231n.fast_layers import *\n",
    "from cs231n.solver import Solver\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots\n",
    "plt.rcParams['image.interpolation'] = 'nearest'\n",
    "plt.rcParams['image.cmap'] = 'gray'\n",
    "\n",
    "# for auto-reloading external modules\n",
    "# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "def rel_error(x, y):\n",
    "  \"\"\" returns relative error \"\"\"\n",
    "  return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train:  (49000, 3, 32, 32)\n",
      "y_train:  (49000,)\n",
      "X_val:  (1000, 3, 32, 32)\n",
      "y_val:  (1000,)\n",
      "X_test:  (1000, 3, 32, 32)\n",
      "y_test:  (1000,)\n"
     ]
    }
   ],
   "source": [
    "# Load the (preprocessed) CIFAR10 data.\n",
    "\n",
    "data = get_CIFAR10_data()\n",
    "for k, v in data.items():\n",
    "  print('%s: ' % k, v.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive forward pass\n",
    "The core of a convolutional network is the convolution operation. In the file `cs231n/layers.py`, implement the forward pass for the convolution layer in the function `conv_forward_naive`. \n",
    "\n",
    "You don't have to worry too much about efficiency at this point; just write the code in whatever way you find most clear.\n",
    "\n",
    "You can test your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_naive\n",
      "difference:  2.2121476417505994e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "w_shape = (3, 3, 4, 4)\n",
    "x = np.linspace(-0.1, 0.5, num=np.prod(x_shape)).reshape(x_shape)\n",
    "w = np.linspace(-0.2, 0.3, num=np.prod(w_shape)).reshape(w_shape)\n",
    "b = np.linspace(-0.1, 0.2, num=3)\n",
    "\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "out, _ = conv_forward_naive(x, w, b, conv_param)\n",
    "correct_out = np.array([[[[-0.08759809, -0.10987781],\n",
    "                           [-0.18387192, -0.2109216 ]],\n",
    "                          [[ 0.21027089,  0.21661097],\n",
    "                           [ 0.22847626,  0.23004637]],\n",
    "                          [[ 0.50813986,  0.54309974],\n",
    "                           [ 0.64082444,  0.67101435]]],\n",
    "                         [[[-0.98053589, -1.03143541],\n",
    "                           [-1.19128892, -1.24695841]],\n",
    "                          [[ 0.69108355,  0.66880383],\n",
    "                           [ 0.59480972,  0.56776003]],\n",
    "                          [[ 2.36270298,  2.36904306],\n",
    "                           [ 2.38090835,  2.38247847]]]])\n",
    "\n",
    "# Compare your output to ours; difference should be around e-8\n",
    "print('Testing conv_forward_naive')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Aside: Image processing via convolutions\n",
    "\n",
    "As fun way to both check your implementation and gain a better understanding of the type of operation that convolutional layers can perform, we will set up an input containing two images and manually set up filters that perform common image processing operations (grayscale conversion and edge detection). The convolution forward pass will apply these operations to each of the input images. We can then visualize the results as a sanity check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/human/anaconda3/envs/cs231n/lib/python3.6/site-packages/ipykernel_launcher.py:3: DeprecationWarning: `imread` is deprecated!\n",
      "`imread` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0.\n",
      "Use ``imageio.imread`` instead.\n",
      "  This is separate from the ipykernel package so we can avoid doing imports until\n",
      "/home/human/anaconda3/envs/cs231n/lib/python3.6/site-packages/ipykernel_launcher.py:10: DeprecationWarning: `imresize` is deprecated!\n",
      "`imresize` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0.\n",
      "Use ``skimage.transform.resize`` instead.\n",
      "  # Remove the CWD from sys.path while we load stuff.\n",
      "/home/human/anaconda3/envs/cs231n/lib/python3.6/site-packages/ipykernel_launcher.py:11: DeprecationWarning: `imresize` is deprecated!\n",
      "`imresize` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0.\n",
      "Use ``skimage.transform.resize`` instead.\n",
      "  # This is added back by InteractiveShellApp.init_path()\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f85d4670a58>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from scipy.misc import imread, imresize\n",
    "\n",
    "kitten, puppy = imread('kitten.jpg'), imread('puppy.jpg')\n",
    "# kitten is wide, and puppy is already square\n",
    "d = kitten.shape[1] - kitten.shape[0]\n",
    "kitten_cropped = kitten[:, d//2:-d//2, :]\n",
    "\n",
    "img_size = 200   # Make this smaller if it runs too slow\n",
    "x = np.zeros((2, 3, img_size, img_size))\n",
    "x[0, :, :, :] = imresize(puppy, (img_size, img_size)).transpose((2, 0, 1))\n",
    "x[1, :, :, :] = imresize(kitten_cropped, (img_size, img_size)).transpose((2, 0, 1))\n",
    "\n",
    "# Set up a convolutional weights holding 2 filters, each 3x3\n",
    "w = np.zeros((2, 3, 3, 3))\n",
    "\n",
    "# The first filter converts the image to grayscale.\n",
    "# Set up the red, green, and blue channels of the filter.\n",
    "w[0, 0, :, :] = [[0, 0, 0], [0, 0.3, 0], [0, 0, 0]]\n",
    "w[0, 1, :, :] = [[0, 0, 0], [0, 0.6, 0], [0, 0, 0]]\n",
    "w[0, 2, :, :] = [[0, 0, 0], [0, 0.1, 0], [0, 0, 0]]\n",
    "\n",
    "# Second filter detects horizontal edges in the blue channel.\n",
    "w[1, 2, :, :] = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]]\n",
    "\n",
    "# Vector of biases. We don't need any bias for the grayscale\n",
    "# filter, but for the edge detection filter we want to add 128\n",
    "# to each output so that nothing is negative.\n",
    "b = np.array([0, 128])\n",
    "\n",
    "# Compute the result of convolving each input in x with each filter in w,\n",
    "# offsetting by b, and storing the results in out.\n",
    "out, _ = conv_forward_naive(x, w, b, {'stride': 1, 'pad': 1})\n",
    "\n",
    "def imshow_noax(img, normalize=True):\n",
    "    \"\"\" Tiny helper to show images as uint8 and remove axis labels \"\"\"\n",
    "    if normalize:\n",
    "        img_max, img_min = np.max(img), np.min(img)\n",
    "        img = 255.0 * (img - img_min) / (img_max - img_min)\n",
    "    plt.imshow(img.astype('uint8'))\n",
    "    plt.gca().axis('off')\n",
    "\n",
    "# Show the original images and the results of the conv operation\n",
    "plt.subplot(2, 3, 1)\n",
    "imshow_noax(puppy, normalize=False)\n",
    "plt.title('Original image')\n",
    "plt.subplot(2, 3, 2)\n",
    "imshow_noax(out[0, 0])\n",
    "plt.title('Grayscale')\n",
    "plt.subplot(2, 3, 3)\n",
    "imshow_noax(out[0, 1])\n",
    "plt.title('Edges')\n",
    "plt.subplot(2, 3, 4)\n",
    "imshow_noax(kitten_cropped, normalize=False)\n",
    "plt.subplot(2, 3, 5)\n",
    "imshow_noax(out[1, 0])\n",
    "plt.subplot(2, 3, 6)\n",
    "imshow_noax(out[1, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive backward pass\n",
    "Implement the backward pass for the convolution operation in the function `conv_backward_naive` in the file `cs231n/layers.py`. Again, you don't need to worry too much about computational efficiency.\n",
    "\n",
    "When you are done, run the following to check your backward pass with a numeric gradient check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_backward_naive function\n",
      "dx error:  1.159803161159293e-08\n",
      "dw error:  2.2471264748452487e-10\n",
      "db error:  3.37264006649648e-11\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(4, 3, 5, 5)\n",
    "w = np.random.randn(2, 3, 3, 3)\n",
    "b = np.random.randn(2,)\n",
    "dout = np.random.randn(4, 2, 5, 5)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_forward_naive(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_forward_naive(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_forward_naive(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "out, cache = conv_forward_naive(x, w, b, conv_param)\n",
    "dx, dw, db = conv_backward_naive(dout, cache)\n",
    "\n",
    "# Your errors should be around e-8 or less.\n",
    "print('Testing conv_backward_naive function')\n",
    "print('dx error: ', rel_error(dx, dx_num))\n",
    "print('dw error: ', rel_error(dw, dw_num))\n",
    "print('db error: ', rel_error(db, db_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive forward\n",
    "Implement the forward pass for the max-pooling operation in the function `max_pool_forward_naive` in the file `cs231n/layers.py`. Again, don't worry too much about computational efficiency.\n",
    "\n",
    "Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_forward_naive function:\n",
      "difference:  4.1666665157267834e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "x = np.linspace(-0.3, 0.4, num=np.prod(x_shape)).reshape(x_shape)\n",
    "pool_param = {'pool_width': 2, 'pool_height': 2, 'stride': 2}\n",
    "\n",
    "out, _ = max_pool_forward_naive(x, pool_param)\n",
    "\n",
    "correct_out = np.array([[[[-0.26315789, -0.24842105],\n",
    "                          [-0.20421053, -0.18947368]],\n",
    "                         [[-0.14526316, -0.13052632],\n",
    "                          [-0.08631579, -0.07157895]],\n",
    "                         [[-0.02736842, -0.01263158],\n",
    "                          [ 0.03157895,  0.04631579]]],\n",
    "                        [[[ 0.09052632,  0.10526316],\n",
    "                          [ 0.14947368,  0.16421053]],\n",
    "                         [[ 0.20842105,  0.22315789],\n",
    "                          [ 0.26736842,  0.28210526]],\n",
    "                         [[ 0.32631579,  0.34105263],\n",
    "                          [ 0.38526316,  0.4       ]]]])\n",
    "\n",
    "# Compare your output with ours. Difference should be on the order of e-8.\n",
    "print('Testing max_pool_forward_naive function:')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive backward\n",
    "Implement the backward pass for the max-pooling operation in the function `max_pool_backward_naive` in the file `cs231n/layers.py`. You don't need to worry about computational efficiency.\n",
    "\n",
    "Check your implementation with numeric gradient checking by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_backward_naive function:\n",
      "dx error:  3.27562514223145e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(3, 2, 8, 8)\n",
    "dout = np.random.randn(3, 2, 4, 4)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: max_pool_forward_naive(x, pool_param)[0], x, dout)\n",
    "\n",
    "out, cache = max_pool_forward_naive(x, pool_param)\n",
    "dx = max_pool_backward_naive(dout, cache)\n",
    "\n",
    "# Your error should be on the order of e-12\n",
    "print('Testing max_pool_backward_naive function:')\n",
    "print('dx error: ', rel_error(dx, dx_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fast layers\n",
    "Making convolution and pooling layers fast can be challenging. To spare you the pain, we've provided fast implementations of the forward and backward passes for convolution and pooling layers in the file `cs231n/fast_layers.py`.\n",
    "\n",
    "The fast convolution implementation depends on a Cython extension; to compile it you need to run the following from the `cs231n` directory:\n",
    "\n",
    "```bash\n",
    "python setup.py build_ext --inplace\n",
    "```\n",
    "\n",
    "The API for the fast versions of the convolution and pooling layers is exactly the same as the naive versions that you implemented above: the forward pass receives data, weights, and parameters and produces outputs and a cache object; the backward pass recieves upstream derivatives and the cache object and produces gradients with respect to the data and weights.\n",
    "\n",
    "**NOTE:** The fast implementation for pooling will only perform optimally if the pooling regions are non-overlapping and tile the input. If these conditions are not met then the fast pooling implementation will not be much faster than the naive implementation.\n",
    "\n",
    "You can compare the performance of the naive and fast versions of these layers by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_fast:\n",
      "Naive: 4.114635s\n",
      "Fast: 0.011371s\n",
      "Speedup: 361.849080x\n",
      "Difference:  4.926407851494105e-11\n",
      "\n",
      "Testing conv_backward_fast:\n",
      "Naive: 7.697228s\n",
      "Fast: 0.044966s\n",
      "Speedup: 171.180738x\n",
      "dx difference:  1.949764775345631e-11\n",
      "dw difference:  3.7012612707710095e-13\n",
      "db difference:  3.481354613192702e-14\n"
     ]
    }
   ],
   "source": [
    "# Rel errors should be around e-9 or less\n",
    "from cs231n.fast_layers import conv_forward_fast, conv_backward_fast\n",
    "from time import time\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 31, 31)\n",
    "w = np.random.randn(25, 3, 3, 3)\n",
    "b = np.random.randn(25,)\n",
    "dout = np.random.randn(100, 25, 16, 16)\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = conv_forward_naive(x, w, b, conv_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = conv_forward_fast(x, w, b, conv_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing conv_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('Difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive, dw_naive, db_naive = conv_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast, dw_fast, db_fast = conv_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting conv_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))\n",
    "print('dw difference: ', rel_error(dw_naive, dw_fast))\n",
    "print('db difference: ', rel_error(db_naive, db_fast))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing pool_forward_fast:\n",
      "Naive: 0.007212s\n",
      "fast: 0.003266s\n",
      "speedup: 2.208586x\n",
      "difference:  0.0\n",
      "\n",
      "Testing pool_backward_fast:\n",
      "Naive: 0.015445s\n",
      "fast: 0.012402s\n",
      "speedup: 1.245357x\n",
      "dx difference:  0.0\n"
     ]
    }
   ],
   "source": [
    "# Relative errors should be close to 0.0\n",
    "from cs231n.fast_layers import max_pool_forward_fast, max_pool_backward_fast\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 32, 32)\n",
    "dout = np.random.randn(100, 3, 16, 16)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = max_pool_forward_naive(x, pool_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = max_pool_forward_fast(x, pool_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing pool_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive = max_pool_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast = max_pool_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting pool_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolutional \"sandwich\" layers\n",
    "Previously we introduced the concept of \"sandwich\" layers that combine multiple operations into commonly used patterns. In the file `cs231n/layer_utils.py` you will find sandwich layers that implement a few commonly used patterns for convolutional networks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu_pool\n",
      "dx error:  6.514336569263308e-09\n",
      "dw error:  1.490843753539445e-08\n",
      "db error:  2.037390356217257e-09\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_pool_forward, conv_relu_pool_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 16, 16)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "out, cache = conv_relu_pool_forward(x, w, b, conv_param, pool_param)\n",
    "dx, dw, db = conv_relu_pool_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu_pool')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu:\n",
      "dx error:  3.5600610115232832e-09\n",
      "dw error:  2.2497700915729298e-10\n",
      "db error:  1.3087619975802167e-10\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_forward, conv_relu_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 8, 8)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "out, cache = conv_relu_forward(x, w, b, conv_param)\n",
    "dx, dw, db = conv_relu_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_forward(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_forward(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_forward(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu:')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Three-layer ConvNet\n",
    "Now that you have implemented all the necessary layers, we can put them together into a simple convolutional network.\n",
    "\n",
    "Open the file `cs231n/classifiers/cnn.py` and complete the implementation of the `ThreeLayerConvNet` class. Remember you can use the fast/sandwich layers (already imported for you) in your implementation. Run the following cells to help you debug:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sanity check loss\n",
    "After you build a new network, one of the first things you should do is sanity check the loss. When we use the softmax loss, we expect the loss for random weights (and no regularization) to be about `log(C)` for `C` classes. When we add regularization this should go up."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initial loss (no regularization):  2.3025840460314893\n",
      "Initial loss (with regularization):  2.5086145191445492\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet()\n",
    "\n",
    "N = 50\n",
    "X = np.random.randn(N, 3, 32, 32)\n",
    "y = np.random.randint(10, size=N)\n",
    "\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (no regularization): ', loss)\n",
    "\n",
    "model.reg = 0.5\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (with regularization): ', loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gradient check\n",
    "After the loss looks reasonable, use numeric gradient checking to make sure that your backward pass is correct. When you use numeric gradient checking you should use a small amount of artifical data and a small number of neurons at each layer. Note: correct implementations may still have relative errors up to the order of e-2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W1 max relative error: 1.380104e-04\n",
      "W2 max relative error: 1.822723e-02\n",
      "W3 max relative error: 3.064049e-04\n",
      "b1 max relative error: 3.477652e-05\n",
      "b2 max relative error: 2.516375e-03\n",
      "b3 max relative error: 7.945660e-10\n"
     ]
    }
   ],
   "source": [
    "num_inputs = 2\n",
    "input_dim = (3, 16, 16)\n",
    "reg = 0.0\n",
    "num_classes = 10\n",
    "np.random.seed(231)\n",
    "X = np.random.randn(num_inputs, *input_dim)\n",
    "y = np.random.randint(num_classes, size=num_inputs)\n",
    "\n",
    "model = ThreeLayerConvNet(num_filters=3, filter_size=3,\n",
    "                          input_dim=input_dim, hidden_dim=7,\n",
    "                          dtype=np.float64)\n",
    "loss, grads = model.loss(X, y)\n",
    "# Errors should be small, but correct implementations may have\n",
    "# relative errors up to the order of e-2\n",
    "for param_name in sorted(grads):\n",
    "    f = lambda _: model.loss(X, y)[0]\n",
    "    param_grad_num = eval_numerical_gradient(f, model.params[param_name], verbose=False, h=1e-6)\n",
    "    e = rel_error(param_grad_num, grads[param_name])\n",
    "    print('%s max relative error: %e' % (param_name, rel_error(param_grad_num, grads[param_name])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overfit small data\n",
    "A nice trick is to train your model with just a few training samples. You should be able to overfit small datasets, which will result in very high training accuracy and comparatively low validation accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 30) loss: 2.414060\n",
      "(Epoch 0 / 15) train acc: 0.200000; val_acc: 0.137000\n",
      "(Iteration 2 / 30) loss: 3.102925\n",
      "(Epoch 1 / 15) train acc: 0.140000; val_acc: 0.087000\n",
      "(Iteration 3 / 30) loss: 2.270330\n",
      "(Iteration 4 / 30) loss: 2.096705\n",
      "(Epoch 2 / 15) train acc: 0.240000; val_acc: 0.094000\n",
      "(Iteration 5 / 30) loss: 1.838880\n",
      "(Iteration 6 / 30) loss: 1.934188\n",
      "(Epoch 3 / 15) train acc: 0.510000; val_acc: 0.173000\n",
      "(Iteration 7 / 30) loss: 1.827912\n",
      "(Iteration 8 / 30) loss: 1.639574\n",
      "(Epoch 4 / 15) train acc: 0.520000; val_acc: 0.188000\n",
      "(Iteration 9 / 30) loss: 1.330082\n",
      "(Iteration 10 / 30) loss: 1.756115\n",
      "(Epoch 5 / 15) train acc: 0.630000; val_acc: 0.167000\n",
      "(Iteration 11 / 30) loss: 1.024162\n",
      "(Iteration 12 / 30) loss: 1.041826\n",
      "(Epoch 6 / 15) train acc: 0.750000; val_acc: 0.229000\n",
      "(Iteration 13 / 30) loss: 1.142777\n",
      "(Iteration 14 / 30) loss: 0.835706\n",
      "(Epoch 7 / 15) train acc: 0.790000; val_acc: 0.247000\n",
      "(Iteration 15 / 30) loss: 0.587786\n",
      "(Iteration 16 / 30) loss: 0.645509\n",
      "(Epoch 8 / 15) train acc: 0.820000; val_acc: 0.252000\n",
      "(Iteration 17 / 30) loss: 0.786844\n",
      "(Iteration 18 / 30) loss: 0.467054\n",
      "(Epoch 9 / 15) train acc: 0.820000; val_acc: 0.178000\n",
      "(Iteration 19 / 30) loss: 0.429880\n",
      "(Iteration 20 / 30) loss: 0.635498\n",
      "(Epoch 10 / 15) train acc: 0.900000; val_acc: 0.206000\n",
      "(Iteration 21 / 30) loss: 0.365807\n",
      "(Iteration 22 / 30) loss: 0.284220\n",
      "(Epoch 11 / 15) train acc: 0.820000; val_acc: 0.201000\n",
      "(Iteration 23 / 30) loss: 0.469343\n",
      "(Iteration 24 / 30) loss: 0.509369\n",
      "(Epoch 12 / 15) train acc: 0.920000; val_acc: 0.211000\n",
      "(Iteration 25 / 30) loss: 0.111638\n",
      "(Iteration 26 / 30) loss: 0.145388\n",
      "(Epoch 13 / 15) train acc: 0.930000; val_acc: 0.213000\n",
      "(Iteration 27 / 30) loss: 0.155575\n",
      "(Iteration 28 / 30) loss: 0.143398\n",
      "(Epoch 14 / 15) train acc: 0.960000; val_acc: 0.212000\n",
      "(Iteration 29 / 30) loss: 0.158160\n",
      "(Iteration 30 / 30) loss: 0.118934\n",
      "(Epoch 15 / 15) train acc: 0.990000; val_acc: 0.220000\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "\n",
    "num_train = 100\n",
    "small_data = {\n",
    "  'X_train': data['X_train'][:num_train],\n",
    "  'y_train': data['y_train'][:num_train],\n",
    "  'X_val': data['X_val'],\n",
    "  'y_val': data['y_val'],\n",
    "}\n",
    "\n",
    "model = ThreeLayerConvNet(weight_scale=1e-2)\n",
    "\n",
    "solver = Solver(model, small_data,\n",
    "                num_epochs=15, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=1)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the loss, training accuracy, and validation accuracy should show clear overfitting:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f85cbd98978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.subplot(2, 1, 1)\n",
    "plt.plot(solver.loss_history, 'o')\n",
    "plt.xlabel('iteration')\n",
    "plt.ylabel('loss')\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(solver.train_acc_history, '-o')\n",
    "plt.plot(solver.val_acc_history, '-o')\n",
    "plt.legend(['train', 'val'], loc='upper left')\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the net\n",
    "By training the three-layer convolutional network for one epoch, you should achieve greater than 40% accuracy on the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 980) loss: 2.304740\n",
      "(Epoch 0 / 1) train acc: 0.103000; val_acc: 0.107000\n",
      "(Iteration 21 / 980) loss: 2.277595\n",
      "(Iteration 41 / 980) loss: 2.105168\n",
      "(Iteration 61 / 980) loss: 1.955614\n",
      "(Iteration 81 / 980) loss: 1.901870\n",
      "(Iteration 101 / 980) loss: 1.786646\n",
      "(Iteration 121 / 980) loss: 1.607626\n",
      "(Iteration 141 / 980) loss: 1.901893\n",
      "(Iteration 161 / 980) loss: 1.900993\n",
      "(Iteration 181 / 980) loss: 1.974500\n",
      "(Iteration 201 / 980) loss: 1.930574\n",
      "(Iteration 221 / 980) loss: 2.061199\n",
      "(Iteration 241 / 980) loss: 1.680599\n",
      "(Iteration 261 / 980) loss: 1.758424\n",
      "(Iteration 281 / 980) loss: 1.987053\n",
      "(Iteration 301 / 980) loss: 1.756236\n",
      "(Iteration 321 / 980) loss: 1.879092\n",
      "(Iteration 341 / 980) loss: 1.813254\n",
      "(Iteration 361 / 980) loss: 2.129946\n",
      "(Iteration 381 / 980) loss: 1.438068\n",
      "(Iteration 401 / 980) loss: 1.829907\n",
      "(Iteration 421 / 980) loss: 1.524082\n",
      "(Iteration 441 / 980) loss: 1.729550\n",
      "(Iteration 461 / 980) loss: 1.840234\n",
      "(Iteration 481 / 980) loss: 1.830851\n",
      "(Iteration 501 / 980) loss: 1.595853\n",
      "(Iteration 521 / 980) loss: 2.126786\n",
      "(Iteration 541 / 980) loss: 1.692218\n",
      "(Iteration 561 / 980) loss: 1.839294\n",
      "(Iteration 581 / 980) loss: 1.495706\n",
      "(Iteration 601 / 980) loss: 1.655335\n",
      "(Iteration 621 / 980) loss: 1.683438\n",
      "(Iteration 641 / 980) loss: 1.742117\n",
      "(Iteration 661 / 980) loss: 1.828452\n",
      "(Iteration 681 / 980) loss: 1.860717\n",
      "(Iteration 701 / 980) loss: 1.546998\n",
      "(Iteration 721 / 980) loss: 1.541053\n",
      "(Iteration 741 / 980) loss: 1.745391\n",
      "(Iteration 761 / 980) loss: 1.678145\n",
      "(Iteration 781 / 980) loss: 2.111524\n",
      "(Iteration 801 / 980) loss: 1.900898\n",
      "(Iteration 821 / 980) loss: 1.668368\n",
      "(Iteration 841 / 980) loss: 1.589296\n",
      "(Iteration 861 / 980) loss: 1.778009\n",
      "(Iteration 881 / 980) loss: 1.700346\n",
      "(Iteration 901 / 980) loss: 1.685917\n",
      "(Iteration 921 / 980) loss: 1.775121\n",
      "(Iteration 941 / 980) loss: 1.903952\n",
      "(Iteration 961 / 980) loss: 1.671379\n",
      "(Epoch 1 / 1) train acc: 0.446000; val_acc: 0.464000\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet(weight_scale=0.001, hidden_dim=500, reg=0.001)\n",
    "\n",
    "solver = Solver(model, data,\n",
    "                num_epochs=1, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=20)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize Filters\n",
    "You can visualize the first-layer convolutional filters from the trained network by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f85cbe2c6d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from cs231n.vis_utils import visualize_grid\n",
    "\n",
    "grid = visualize_grid(model.params['W1'].transpose(0, 2, 3, 1))\n",
    "plt.imshow(grid.astype('uint8'))\n",
    "plt.axis('off')\n",
    "plt.gcf().set_size_inches(5, 5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Spatial Batch Normalization\n",
    "We already saw that batch normalization is a very useful technique for training deep fully-connected networks. As proposed in the original paper [3], batch normalization can also be used for convolutional networks, but we need to tweak it a bit; the modification will be called \"spatial batch normalization.\"\n",
    "\n",
    "Normally batch-normalization accepts inputs of shape `(N, D)` and produces outputs of shape `(N, D)`, where we normalize across the minibatch dimension `N`. For data coming from convolutional layers, batch normalization needs to accept inputs of shape `(N, C, H, W)` and produce outputs of shape `(N, C, H, W)` where the `N` dimension gives the minibatch size and the `(H, W)` dimensions give the spatial size of the feature map.\n",
    "\n",
    "If the feature map was produced using convolutions, then we expect the statistics of each feature channel to be relatively consistent both between different imagesand different locations within the same image. Therefore spatial batch normalization computes a mean and variance for each of the `C` feature channels by computing statistics over both the minibatch dimension `N` and the spatial dimensions `H` and `W`.\n",
    "\n",
    "\n",
    "[3] [Sergey Ioffe and Christian Szegedy, \"Batch Normalization: Accelerating Deep Network Training by Reducing\n",
    "Internal Covariate Shift\", ICML 2015.](https://arxiv.org/abs/1502.03167)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for spatial batch normalization in the function `spatial_batchnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [9.33463814 8.90909116 9.11056338]\n",
      "  Stds:  [3.61447857 3.19347686 3.5168142 ]\n",
      "After spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [ 6.18949336e-16  5.99520433e-16 -1.22124533e-16]\n",
      "  Stds:  [0.99999962 0.99999951 0.9999996 ]\n",
      "After spatial batch normalization (nontrivial gamma, beta):\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [6. 7. 8.]\n",
      "  Stds:  [2.99999885 3.99999804 4.99999798]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "\n",
    "print('Before spatial batch normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', x.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones(C), np.zeros(C)\n",
    "bn_param = {'mode': 'train'}\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to beta and stds close to gamma\n",
    "gamma, beta = np.asarray([3, 4, 5]), np.asarray([6, 7, 8])\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization (nontrivial gamma, beta):')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "After spatial batch normalization (test-time):\n",
      "  means:  [-0.08034406  0.07562881  0.05716371  0.04378383]\n",
      "  stds:  [0.96718744 1.0299714  1.02887624 1.00585577]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the test-time forward pass by running the training-time\n",
    "# forward pass many times to warm up the running averages, and then\n",
    "# checking the means and variances of activations after a test-time\n",
    "# forward pass.\n",
    "N, C, H, W = 10, 4, 11, 12\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "gamma = np.ones(C)\n",
    "beta = np.zeros(C)\n",
    "for t in range(50):\n",
    "  x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "  spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "bn_param['mode'] = 'test'\n",
    "x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "a_norm, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "\n",
    "# Means should be close to zero and stds close to one, but will be\n",
    "# noisier than training-time forward passes.\n",
    "print('After spatial batch normalization (test-time):')\n",
    "print('  means: ', a_norm.mean(axis=(0, 2, 3)))\n",
    "print('  stds: ', a_norm.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_batchnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  2.786648197756335e-07\n",
      "dgamma error:  7.0974817113608705e-12\n",
      "dbeta error:  3.275608725278405e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(C)\n",
    "beta = np.random.randn(C)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "fx = lambda x: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fg = lambda a: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fb = lambda b: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "#You should expect errors of magnitudes between 1e-12~1e-06\n",
    "_, cache = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "dx, dgamma, dbeta = spatial_batchnorm_backward(dout, cache)\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Group Normalization\n",
    "In the previous notebook, we mentioned that Layer Normalization is an alternative normalization technique that mitigates the batch size limitations of Batch Normalization. However, as the authors of [4] observed, Layer Normalization does not perform as well as Batch Normalization when used with Convolutional Layers:\n",
    "\n",
    ">With fully connected layers, all the hidden units in a layer tend to make similar contributions to the final prediction, and re-centering and rescaling the summed inputs to a layer works well. However, the assumption of similar contributions is no longer true for convolutional neural networks. The large number of the hidden units whose\n",
    "receptive fields lie near the boundary of the image are rarely turned on and thus have very different\n",
    "statistics from the rest of the hidden units within the same layer.\n",
    "\n",
    "The authors of [5] propose an intermediary technique. In contrast to Layer Normalization, where you normalize over the entire feature per-datapoint, they suggest a consistent splitting of each per-datapoint feature into G groups, and a per-group per-datapoint normalization instead. \n",
    "\n",
    "![Comparison of normalization techniques discussed so far](normalization.png)\n",
    "<center>**Visual comparison of the normalization techniques discussed so far (image edited from [5])**</center>\n",
    "\n",
    "Even though an assumption of equal contribution is still being made within each group, the authors hypothesize that this is not as problematic, as innate grouping arises within features for visual recognition. One example they use to illustrate this is that many high-performance handcrafted features in traditional Computer Vision have terms that are explicitly grouped together. Take for example Histogram of Oriented Gradients [6]-- after computing histograms per spatially local block, each per-block histogram is normalized before being concatenated together to form the final feature vector.\n",
    "\n",
    "You will now implement Group Normalization. Note that this normalization technique that you are to implement in the following cells was introduced and published to arXiv *less than a month ago* -- this truly is still an ongoing and excitingly active field of research!\n",
    "\n",
    "[4] [Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. \"Layer Normalization.\" stat 1050 (2016): 21.](https://arxiv.org/pdf/1607.06450.pdf)\n",
    "\n",
    "\n",
    "[5] [Wu, Yuxin, and Kaiming He. \"Group Normalization.\" arXiv preprint arXiv:1803.08494 (2018).](https://arxiv.org/abs/1803.08494)\n",
    "\n",
    "\n",
    "[6] [N. Dalal and B. Triggs. Histograms of oriented gradients for\n",
    "human detection. In Computer Vision and Pattern Recognition\n",
    "(CVPR), 2005.](https://ieeexplore.ieee.org/abstract/document/1467360/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Group normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for group normalization in the function `spatial_groupnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [9.72505327 8.51114185 8.9147544  9.43448077]\n",
      "  Stds:  [3.67070958 3.09892597 4.27043622 3.97521327]\n",
      "After spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [-2.14643118e-16  5.25505565e-16  2.65528340e-16 -3.38618023e-16]\n",
      "  Stds:  [0.99999963 0.99999948 0.99999973 0.99999968]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "x_g = x.reshape((N*G,-1))\n",
    "print('Before spatial group normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x_g.mean(axis=1))\n",
    "print('  Stds: ', x_g.std(axis=1))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones((1,C,1,1)), np.zeros((1,C,1,1))\n",
    "bn_param = {'mode': 'train'}\n",
    "\n",
    "out, _ = spatial_groupnorm_forward(x, gamma, beta, G, bn_param)\n",
    "out_g = out.reshape((N*G,-1))\n",
    "print('After spatial group normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out_g.mean(axis=1))\n",
    "print('  Stds: ', out_g.std(axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial group normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_groupnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  7.413109648400194e-08\n",
      "dgamma error:  9.468195772749234e-12\n",
      "dbeta error:  3.354494437653335e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(1,C,1,1)\n",
    "beta = np.random.randn(1,C,1,1)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "gn_param = {}\n",
    "fx = lambda x: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fg = lambda a: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fb = lambda b: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "_, cache = spatial_groupnorm_forward(x, gamma, beta, G, gn_param)\n",
    "dx, dgamma, dbeta = spatial_groupnorm_backward(dout, cache)\n",
    "#You should expect errors of magnitudes between 1e-12~1e-07\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
